package Day2025_04_26;

/**
 * 题目: Z 字形变换
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 */

/**
 * 模拟: 找到其中的规律
 * 可以明显发现后面的数据都是基于前面的竖折 +上一个特定的值所得到的,
 * 所以这题的要点就是如何求得这一个特定的值,
 * 可以观察规律, 我们可以将每行的开头和结尾去掉, 这样可以求得 (n - 2) * 2 + 2 = (n - 1) * 2 (这就是那特定的值) 记作 x
 * 接下来我们只需要将前面一竖折表示出来, 后面的在在这基础上加上这一特定的值就可以了
 * 现在难点在与前面的竖折怎么表示 ?
 * 咱可以发现竖折只有题目要求我们的 numRows行, 于是我们可以得到肯定要循环 numRows次
 * 再发现除了 第一行和最后一行 每一行中竖折只有两个数要求, 而且他们的下标和加起来正好等于我们前面求得的 numRows
 * 这就简单了, 我们只需要定义一个数 a, 剩下的用 b = x - a, 既可以得到, 在特殊处理首行和尾行即可
 * 首行和尾行的处理特别简单, 他们只需要求得一个数, 剩下的全都可以 + x 表示
 */

public class LeetCode6 {
    public String convert(String s, int numRows) {
        char[] ss = s.toCharArray();
        int n = ss.length;

        // 特殊处理 numRows == 1 时, 直接返回原字符串即可
        if (numRows <= 1) return s;

        // 求出特殊数
        int x = (numRows - 1) * 2;

        // 定义字符串拼接
        StringBuffer ret = new StringBuffer();

        // 第一层循环是 n 的竖面长度
        for (int i = 0; i < numRows; i++) {

            // 首行和尾行特殊处理
            if (i == 0 || i == numRows - 1) {
                for (int a = i; a < n; a += x) {
                    ret.append(ss[a]);
                }
            } else {
                for (int a = i, b = x - a; a < n; a += x, b += x) {
                    ret.append(ss[a]);
                    if (b < n) ret.append(ss[b]);
                }
            }
        }
        return ret.toString();
    }

    // 规范写法
    public String convert2(String s, int numRows) {
        if (numRows == 1) return s;
        char[] ss = s.toCharArray();
        int n = ss.length;
        int d = 2 * numRows - 2;
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < n; i += d) str.append(ss[i]);
        for (int k = 1; k < numRows - 1; k++) {
            for (int i = k, j = d - i; i < n || j < n; i += d, j += d) {
                if (i < n) str.append(ss[i]);
                if (j < n) str.append(ss[j]);
            }
        }
        for (int i = numRows - 1; i < n; i += d) str.append(ss[i]);
        return str.toString();
    }
}
